popover: Fix submenu navigation
authorMatthias Clasen <mclasen@redhat.com>
Tue, 17 Nov 2020 02:27:15 +0000 (21:27 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 17 Nov 2020 02:34:33 +0000 (21:34 -0500)
In commit 024d832d943b2abf4f0d, we introduced a
cascade-popdown property that makes closing a submenu
propagate up and close its parent menus. This is the
behavior we want when a menuitem in the submen is
activated.

What we overlooked is that we still need to be able to
close a submenu during navigation, before opening another
one. And in this case, propagating the closing is breaking
things. Fix this by adding a private close_submenu api
to GtkPopoverMenu that avoids the propagation.

Fixes: #3301
gtk/gtkmodelbutton.c
gtk/gtkpopovermenu.c
gtk/gtkpopovermenuprivate.h

index 501dc5e0872ccc9c7720d1952f0b3818cb23ed59..3d2e2519c48c14dbff052f139cb263357a84b867 100644 (file)
@@ -1326,26 +1326,6 @@ gtk_model_button_class_init (GtkModelButtonClass *class)
   g_object_unref (action);
 }
 
-static void
-close_submenus (GtkPopover *popover)
-{
-  GtkPopoverMenu *menu;
-
-  if (GTK_IS_POPOVER_MENU (popover))
-    {
-      GtkWidget *submenu;
-
-      menu = GTK_POPOVER_MENU (popover);
-      submenu = gtk_popover_menu_get_open_submenu (menu);
-      if (submenu)
-        {
-          close_submenus (GTK_POPOVER (submenu));
-          gtk_popover_popdown (GTK_POPOVER (submenu));
-          gtk_popover_menu_set_open_submenu (menu, NULL);
-        }
-    }
-}
-
 static gboolean
 open_submenu (gpointer data)
 {
@@ -1363,7 +1343,7 @@ open_submenu (gpointer data)
           GtkWidget *submenu = button->popover;
 
           if (gtk_popover_menu_get_open_submenu (GTK_POPOVER_MENU (popover)) != submenu)
-            close_submenus (popover);
+            gtk_popover_menu_close_submenus (GTK_POPOVER_MENU (popover));
 
           gtk_popover_popup (GTK_POPOVER (submenu));
           gtk_popover_menu_set_open_submenu (GTK_POPOVER_MENU (popover), submenu);
index c3f39ed0ce4efe151bf6e2bfd4e6d9695990a519..d6e5f91887bd30ebdea9113e2c88a645ccefb01a 100644 (file)
@@ -189,6 +189,20 @@ gtk_popover_menu_set_open_submenu (GtkPopoverMenu *menu,
   menu->open_submenu = submenu;
 }
 
+void
+gtk_popover_menu_close_submenus (GtkPopoverMenu *menu)
+{
+  GtkWidget *submenu;
+
+  submenu = menu->open_submenu;
+  if (submenu)
+    {
+      gtk_popover_menu_close_submenus (GTK_POPOVER_MENU (submenu));
+      gtk_widget_hide (submenu);
+      gtk_popover_menu_set_open_submenu (menu, NULL);
+    }
+}
+
 GtkWidget *
 gtk_popover_menu_get_active_item (GtkPopoverMenu *menu)
 {
index 6c3da479506ee56203f0dfa25e56d1e9b74d2268..4e69627ad40070cf61c52dad7daf16cee72f6135 100644 (file)
@@ -28,6 +28,8 @@ void       gtk_popover_menu_set_active_item  (GtkPopoverMenu *menu,
 GtkWidget *gtk_popover_menu_get_open_submenu (GtkPopoverMenu *menu);
 void       gtk_popover_menu_set_open_submenu (GtkPopoverMenu *menu,
                                               GtkWidget      *submenu);
+void       gtk_popover_menu_close_submenus   (GtkPopoverMenu *menu);
+
 GtkWidget *gtk_popover_menu_get_parent_menu  (GtkPopoverMenu *menu);
 void       gtk_popover_menu_set_parent_menu  (GtkPopoverMenu *menu,
                                               GtkWidget      *parent);